/**
 * File Name:		JaxbOxm.java
 * Package Name:	com.sable.engine.jaxb
 * Project Name:	SABLE
 * Create Date:		Apr 17, 2011 3:23:48 PM
 * Create By:		shangxj
 */
package com.googlecode.jtoy.jee.jaxb;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.util.List;

import javax.xml.bind.JAXBException;

import org.xml.sax.SAXException;

/**
 * @author shangxj
 * @date Apr 17, 2011 3:23:48 PM
 */
public interface Jaxb {

	/**
	 * 根据Schema验证xml格式是否正确，如果正确，则程序正常执行，否则抛出异常
	 * 
	 * @param inStream xml输入流
	 * @param schemaFile Schema文件路径(相对于Classpath)
	 * @return
	 * @throws SAXException
	 * @throws IOException
	 */
	public abstract boolean validate(InputStream inStream);

	public abstract boolean validate(Reader reader);

	/**
	 * 將xml文件转化为指定的clazz,此方法，不进行xml格式验证。
	 * 
	 * @param inStream xml输入流
	 * @return 解组结果，即生成的java对象
	 * @throws JAXBException
	 * @throws IOException
	 */
	public abstract <T> T unmarshal(InputStream inStream) throws JAXBException, IOException;

	public abstract <T> T unmarshal(Reader reader) throws JAXBException, IOException;

	/**
	 * 將xml文件转化为指定的clazz,此方法，进行xml格式验证。如果有错误，保存在本类的 Messages 中。
	 * 
	 * @param reader xml输入流
	 * @return 解组结果，即生成的java对象
	 * @throws JAXBException
	 * @throws SAXException
	 * @since CodingExample Ver(编码范例查看) 1.1
	 */
	public abstract <T> T unmarshalWithValidate(InputStream inStream);

	public abstract <T> T unmarshalWithValidate(Reader reader);

	/**
	 * 将指定的类T转换为xml格式的文档。
	 * 
	 * @param t 传入要编组的对象
	 * @return 编组结果，对象T转换成的xml
	 * @throws JAXBException
	 */
	public abstract <T> StringWriter marshal(T t) throws JAXBException;

	/**
	 * 是否有错误
	 */
	public abstract boolean hasError();

	/**
	 * 错误消息
	 */
	public abstract List<Message> getMessages();
}
